這個系列會帶著您通過Node.js中的Discord.js套件,從0到1開始製作屬於自己的Discord機器人,希望可以幫助大家成為機器人的開發者哦!
這篇文章會帶著大家製作一個指令:bot-info,用途是查看機器人的相關資訊,指令註冊的部分已經在Ep.5.0指導過,若還沒看過的可以先行前往閱讀唷!
要製作一個新的指令之前,第一步便是構想指令的大致架構,在此分為以下五項:
前兩項是在輸入斜線 (/) 時使用者會看到的資訊,通常會讓使用者對於指令的用途和用法一目了然。
而第三~五項是協助您設計指令的程式,讓您有明確的方向製作並供使用者使用。
指令名稱已經提及,是bot-info,當然您也可以自行設計名稱,但要注意指令的註冊和回應偵測需使用同樣的名稱,否則會發生錯誤。
指令是用來得知機器人的相關資訊的,因此我在此使用簡短的文字:「查看機器人的相關資料及資訊」來帶領使用者了解此指令。
如上所述,指令是用來了解機器人的相關資訊,因此我們在製作或構想時須朝此方向,若偏離太多會導致使用者使用時感到困惑或混亂。
回應的內容是一大重點,讓我們來構思機器人會有哪些相關資訊:
順帶一提,在製作指令時不知從何下手時,可以從官方指令翻閱相關內容
目前的指令上不需要其他功能,因此此部分先省略!
想好架構了,那就開始製作指令吧,一樣會使用到機器人的主程式 index.js
:
......前段省略
client.on('interactionCreate', async interaction => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName === 'ping') {
const msg = await interaction.reply({
content: "正在計算延遲......",
fetchReply: true
});
const ping = msg.createdTimestamp - interaction.createdTimestamp;
interaction.editReply(`機器人延遲:${ping} ms\nAPI延遲:${client.ws.ping} ms`)
}
});
後段省略......
在偵測指令名稱的區域中新增一個判斷式,判斷指令名稱為bot-info的指令
......前段省略
if (interaction.commandName === 'ping') {
const msg = await interaction.reply({
content: "正在計算延遲......",
fetchReply: true
});
const ping = msg.createdTimestamp - interaction.createdTimestamp;
interaction.editReply(`機器人延遲:${ping} ms\nAPI延遲:${client.ws.ping} ms`)
}
if (interaction.commandName === 'bot-info') {
}
});
後段省略......
接下來,我們要撰寫的程式都會在此判斷式中
......前段省略
if (interaction.commandName === 'bot-info') {
}
後段省略......
既然知道了要找的資訊,那就先來一個一個知道獲取的方法吧!
獲得機器人使用者名稱的方法如下
client.user.username
ClientUser是指目前登入的客戶端,而username是用於獲取其使用者名稱
機器人ID的獲取方法如下
client.user.id
同樣是從ClientUser獲得,id即是機器人的ID,和先前複製的ClientID相同
機器人的製作者建議自行以字串方式填入,在此不多做說明
獲得機器人的建立時間方式如下
client.user.createdTimestamp
Timestamp
是指時間戳記,此處獲得的時間戳記是「以毫秒表示從格林威治標準時間的西元1970年1月1日經過了多少時間」,將會是一串數字,那要如何轉換成人話呢?
首先,雖然從Discord獲得的為毫秒時間戳記,但用於表示的需使用秒的時間戳記,因此我們先將其除以1000轉換為秒
client.user.createdTimestamp/1000
接下來,用Discord的時間表示格式進行處理
`<t:${client.user.createdTimestamp/1000}:R>`
但現在還是顯示不出來唷!
因為我們現在得到的是一個小數,Discord要求的是一個整數,因此我們使用「~~」來將其四捨五入
`<t:${~~(client.user.createdTimestamp/1000)}:R>`
這樣就得到了一個在Discord會顯示為時間的字串囉!
機器人的邀請連結請從邀請機器人的篇章獲取,將其以字串方式表示,在此補充讓其顯示為文字(超連結)的方法
'[要顯示的文字填寫在中括號中](要連結到的網址填在小括號中)'
這是一種Markdown的語法,詳細內容可以自行搜尋
機器人的版本也可以自行以字串方式添加,順便在此介紹版本號碼的一種標準格式
major
.minor
.build
三個英語單字分別代表一個數字,中間以小數點分隔。
major:在有大型更動時進行變更
minor:在有較大更動但不至於major時變更
build:在有小型更動(像是修正錯誤)時變更
以下是一個維基百科擷取的例子:1.0
→1.0.1
→1.0.2
→1.1
→1.1.1
→2.0
→2.1
→2.1.1
→3.0
機器人所在的伺服器數量獲取方式如下
client.guilds.cache.size
會獲得機器人所在伺服器數量的數字
接下來,獲得機器人上線時間的方式如下(此處指機器人此次上線持續運行的時間)
client.uptime
將會獲取機器人上線後經過了「幾毫秒」,讓我們來將其再次轉換為人話吧!
我們的目標為讓其轉換為HH:MM:SS,也就是時:分:秒的格式,因此我們來建立一個函式,用於執行此功能
function msToHMS(ms) {
let seconds = ms / 1000; //將毫秒轉換為秒
const hours = parseInt( seconds / 3600 ); //將可以轉為小時的秒轉換為小時
seconds = seconds % 3600; //去除已轉換為小時的秒
const minutes = parseInt( seconds / 60 ); //將可以轉為分鐘的秒轉換為分鐘
seconds = seconds % 60; //去除已轉換為分鐘的秒
return(`${hours}:${minutes}:${~~(seconds)}`); //回傳轉換後的結果,秒數進行四捨五入
}
建議將此函式放到所有程式的最後方(CLIENT.LOGIN後
),方便程式碼的閱讀與整理
這時,我們將剛剛的毫秒uptime丟到裡面進行處理
msToHMS(client.uptime)
就可以得到我們想要的結果(字串型別)囉!
接下來,我們將剛剛所獲得的資訊整理到程式碼中吧!
......前段省略
if (interaction.commandName === 'bot-info') {
interaction.reply(
`機器人名稱:${client.user.username}\n`+
`機器人ID:${client.user.id}\n`+
`機器人製作者:自行填寫\n`+
`機器人建立時間:<t:${~~(client.user.createdTimestamp/1000)}:R>\n`+
`機器人邀請連結:自行填寫\n`+
`機器人版本:自行填寫\n`+
`機器人所在伺服器數量:${client.guilds.cache.size}\n`+
`機器人上線時間:${msToHMS(client.uptime)}`
)
}
後段省略......
此時可以存檔後執行程式碼,並到Discord輸入指令試看看
node index.js
此時可以看到剛剛的成果出現囉!關於將其美化為嵌入訊息,會在之後的文章進一步說明。
此篇文章帶著大家製作了bot-info指令,並加上了許多相關資料,希望對大家有幫助,盡情期待下一篇文章吧,掰掰!